iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
Software Development

iOS 學習筆記系列 第 20

Day20 Combine 07 - Operators 其他常用操作符

  • 分享至 

  • xImage
  •  

breakpoint

breakpoint操作符可以發送調試信號來暫停進程的運行(只要在給定的閉包中返回 true),當上游發佈任何消息時. 可用於製造 Debug 的中斷點的方法

func breakpointDemo() {
        [1, 2].publisher
            .breakpoint(receiveSubscription: { subscription in
                return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
            }, receiveOutput: { value in
                return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
            }, receiveCompletion: { completion in
                return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
            })
            .sink(receiveValue: { _ in
                
            })
            .store(in: &cancellables)
}

從上面的示例程式碼中,我們可以看出,通過使用 breakpoint 操作符,我們可以很容易地在訂閱操作、輸出、完成發生時啟用斷點。
如果這時候想直接在程式碼上打斷點,我們就要重寫 sink 部分的程式碼,而且無法輕易地為訂閱操作啟用斷點

handleEvents

handleEvents 操作符可以在發布事件發生時執行指定的閉包,介入所有上游的事件, 不會因為 RELEASE/DEBUG 的前置處理器差異

func handleEventsDemo() {
        [1, 2].publisher
            .handleEvents(receiveSubscription: { subscription in
                // 訂閱事件
            }, receiveOutput: { value in
                // 值事件
            }, receiveCompletion: { completion in
                // 完成事件
            }, receiveCancel: {
                // 取消事件
            }, receiveRequest: { demand in
                // 請求需求的事件
            })
            .sink(receiveValue: { _ in
                
            })
            .store(in: &cancellables)
    }

zip

zip 操作符會將上游發布者發布的元素結合到一個流中,在每個上游發布者發送的元素配對時才向下游發送一個包含配對元素的元組。

func zipDemo() {
        let oddPublisher = PassthroughSubject<Int, Never>()
        let evenStringPublisher = PassthroughSubject<String, Never>()
        
        oddPublisher
            .zip(evenStringPublisher)
            .sink(receiveCompletion: { completion in
                print(completion)
            }, receiveValue: { value in
                print(value)
            })
            .store(in: &cancellables)
        
        oddPublisher.send(1)
        evenStringPublisher.send("2")
        oddPublisher.send(3)
        evenStringPublisher.send("4")
        evenStringPublisher.send("6")
        evenStringPublisher.send("8")
}
/*印出 
(1, "2")
(3, "4")
*/

merge

merge 操作符可以將上游發布者發送的元素合併到一個序列中。merge 操作符要求上游發布者的輸出和失敗類型完全相同。

func mergeDemo() {
      let oddPublisher = PassthroughSubject<Int, Never>()
      let evenPublisher = PassthroughSubject<Int, Never>()
      
      oddPublisher
          .merge(with: evenPublisher)
          .sink(receiveCompletion: { completion in
              print(completion)
          }, receiveValue: { value in
              print(value)
          })
          .store(in: &cancellables)
      
      oddPublisher.send(1)
      evenPublisher.send(2)
      oddPublisher.send(3)
      evenPublisher.send(4)
}
/*印出 
1
2
3
4
*/

上一篇
Day19 Combine 06 - Operators 類型介紹 : 過濾操作符
下一篇
Day21 URLSession 01 - POST
系列文
iOS 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言